#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 设置主窗口
    setWindowTitle("File System Browser");
    setWindowIcon(QIcon(":/Logo.png"));
    resize(2000, 1000);

    // ----------------文件系统模型初始化--------------
    dirModel = new QFileSystemModel(this);    // 目录模型
    dirModel->setRootPath("");
    dirModel->setFilter(QDir::Dirs | QDir::NoDotAndDotDot);

    fileModel = new QFileSystemModel(this);   // 文件模型
    fileModel->setRootPath("");
    fileModel->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);

    // ----------------文件资源管理器-----------------
    // 1. 创建主分割窗口
    QSplitter *mainSplitter = new QSplitter(Qt::Horizontal, this);
    mainSplitter->setStretchFactor(0, 1);
    mainSplitter->setStretchFactor(1, 3);

    // 2. 左侧导航栏（树形结构）
    navigationTree = new QTreeView(mainSplitter);
    navigationTree->setHeaderHidden(true);  // 隐藏标题栏
    navigationTree->setMinimumWidth(150);
    navigationTree->setModel(dirModel);

    // 设置默认路径
    QString defaultPath = "D:/Code/Cpp_And_C_Demo/qt-creator-demo/File_System_Browser/TestDir";
    QModelIndex rootIndex = dirModel->index(defaultPath);
    navigationTree->setRootIndex(rootIndex);
    navigationTree->expand(rootIndex);

    // 3. 右侧内容区（上：地址栏 + 下：文件列表）
    QWidget *rightPanel = new QWidget(mainSplitter);
    QVBoxLayout *rightLayout = new QVBoxLayout(rightPanel);

    // 3.1 地址栏（路径导航）
    QHBoxLayout *addressLayout = new QHBoxLayout();
    QLabel *pathLabel = new QLabel("路径：");
    addressBar = new QLineEdit(defaultPath);
    QPushButton *refreshButton = new QPushButton("刷新");

    addressLayout->addWidget(pathLabel);
    addressLayout->addWidget(addressBar, 1);
    addressLayout->addWidget(refreshButton);
    rightLayout->addLayout(addressLayout);

    // 3.2 文件列表（表格视图）
    fileTableView = new QTableView();
    fileTableView->verticalHeader()->hide();
    fileTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    fileTableView->setModel(fileModel);
    fileTableView->setRootIndex(fileModel->index(defaultPath));
    rightLayout->addWidget(fileTableView, 1);

    // 4. 底部状态栏
    QStatusBar *statusBar = new QStatusBar();
    statusBar->showMessage("0个项目 | ");
    setStatusBar(statusBar);

    QTimer::singleShot(100, this, &MainWindow::updateItemCount);

    // 5. 工具栏（排序、查看操作）
    QToolBar *mainToolBar = addToolBar("工具栏");
    QAction *backAction = mainToolBar->addAction("回退到上一级");

    // 设置中间部件
    setCentralWidget(mainSplitter);

    // ---------------------信号连接--------------------
    // 点击导航树中的文件夹后，在文件列表中显示其内容
    connect(navigationTree, &QTreeView::doubleClicked, [=](const QModelIndex index){
        QString path = dirModel->filePath(index);
        qDebug() << "选中路径：" << path;

        // 更新文件表格的根索引
        fileTableView->setRootIndex(fileModel->index(path));

        // 更新地址栏显示
        addressBar->setText(path);
    });

    // 点击文件列表中的文件夹则进入该文件夹
    // 点击文件列表中的文件则打开文件
    connect(fileTableView, &QTableView::doubleClicked, [=](const QModelIndex &index){
        QString path = fileModel->filePath(index);

        if(fileModel->isDir(index)){
            // 更新文件表格显示的内容
            fileTableView->setRootIndex(index);

            // 更新地址栏
            addressBar->setText(path);
        }else{
            QDesktopServices::openUrl(QUrl::fromLocalFile(path));
        }
    });

    // 输入路径后按下回车或者刷新，则更新导航树和文件列表
    connect(addressBar, &QLineEdit::returnPressed, this, &MainWindow::onAddressChanged);
    connect(refreshButton, &QPushButton::clicked, this, &MainWindow::onAddressChanged);

    // 点击工具栏的回退按钮之后，显示上一级的内容到文件列表中
    connect(backAction, &QAction::triggered, this, &MainWindow::navigateToParent);

    // 监听文件模型的变化事件，并在目录加载完成或模型重置时更新界面上的项目计数
    connect(fileModel, &QFileSystemModel::directoryLoaded, this, &MainWindow::updateItemCount);
    connect(fileModel, &QFileSystemModel::modelReset, this, &MainWindow::updateItemCount);
}

MainWindow::~MainWindow()
{
}

void MainWindow::onAddressChanged()
{
    QString path = addressBar->text();
    QDir dir(path);
    if(!dir.exists()){
        QMessageBox::warning(this, "错误","路径不存在");
        return;
    }

    path = dir.absolutePath();

    // 更新导航树
    QModelIndex index = dirModel->index(path);
    if(index.isValid()){
        navigationTree->setRootIndex(index);
        navigationTree->expand(index);
        navigationTree->setCurrentIndex(index);
        navigationTree->scrollTo(index);
    }

    // 更新文件表格
    fileTableView->setRootIndex(fileModel->index(path));
}

void MainWindow::navigateToParent()
{
    // 获取当前显示的根路径
    QModelIndex currentRoot = fileTableView->rootIndex();
    if(!currentRoot.isValid()){
        return;
    }
    // 获取父目录路径
    QString parentPath = fileModel->filePath(currentRoot.parent());

    // 更新文件表格显示父目录的内容
    fileTableView->setRootIndex(fileModel->index(parentPath));

    // 更新地址栏
    addressBar->setText(parentPath);
}

void MainWindow::updateItemCount()
{
    // 获取当前目录下的项目总数
    int count = fileModel->rowCount(fileTableView->rootIndex());

    // 更新状态栏文字
    statusBar()->showMessage(QString("%1个项目 | ").arg(count));
}

